package com.example.common.demo;

import cn.hutool.core.annotation.Alias;
import cn.hutool.core.bean.BeanUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import lombok.experimental.Accessors;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;

import javax.annotation.Resource;
import java.util.*;

/**
 * @author: mtl
 * @Date: 2022/1/14 09:36
 * @Description: 数据对接demo 将两个实体类 字段名称不一致的对象相互转换的工具
 */
public class DataDocking<T> {
    public static List<Object> lists = new ArrayList<>();
    static{
        User user = new User().setAge("3").setName("张三");
        User user2 = new User().setAge("4").setName("李四");
        User user3 = new User().setAge("5").setName("王五");
        lists.add(user);
        lists.add(user2);
        lists.add(user3);
    }

    /**
     * demo
     * @param args
     */
    public static void main(String[] args) {
        List<Order> objectList = docking(DataDocking.lists, Order.class);
        System.out.println(objectList);

    }


    /**
     * 对象转换
     * @param list 源对象 （该对象需要配置别名注解 @Alias）
     * @param cla 需要转换的类
     * @return List<class> 转换之后的对象集合
     */
    public static List docking(List<Object> list, Class cla){
        List<Object>  objectList = new ArrayList<>();
        list.forEach(data->{
            Map<String, Object> map = BeanUtil.beanToMap(data);
            Object obj = BeanUtil.toBean(map, cla);
            objectList.add(obj);
        });
        return JSONObject.parseArray(JSONObject.toJSONString(objectList),cla);
    }


}

/**
 * 源对象
 */
@Accessors(chain = true)
@Data
class User{
    /**
     * 注解上配置希望该字段转换的另一个字段的名称
     */
    @Alias("username")
    private String name;
    @Alias("userAge")
    private String age;
}

/**
 * 希望转换的对象
 */
@Data
class Order{
    private String username;
    private String userAge;
}
